//
// Created by LiuYou on 2021/7/23.
//

#ifndef MODERNCPP_HASPTRLIKEVALUE_HPP
#define MODERNCPP_HASPTRLIKEVALUE_HPP


#include <string>
#include <ostream>


namespace ResourceManagement {
    class HasPtrLikeValue {
    public:
        friend void swap(HasPtrLikeValue& lhs, HasPtrLikeValue& rhs) {
            std::swap( lhs.ptrString, rhs.ptrString );
            std::swap( lhs.defaultValue, rhs.defaultValue );
        }

        HasPtrLikeValue& operator=(HasPtrLikeValue rhs);

    public:
//        friend std::ostream& operator<<(std::ostream& os, const HasPtrLikeValue& value);

        // 尽量将流输出函数写在类内。对具体的输出的格式可以修改, 而且也可以更换输出的流, 将对象信息输出到文件流中保存下来。
        friend std::ostream& operator<<(std::ostream& os, const HasPtrLikeValue& value) {
            os << "{" << "ptrString: " << value.ptrString
               << ", *ptrString: " << "\"" << *value.ptrString << "\""
               << ", defaultValue: " << value.defaultValue << "}";
            return os;
        }



        // Big-Three begin
    public:
        /// \brief CLion生成的构造函数
//        HasPtrLikeValue(std::string* ptrString, int defaultValue);

        /// \brief 书上的写法。
        /// \param str
        explicit HasPtrLikeValue(const std::string& str = std::string());

        virtual ~HasPtrLikeValue();

        /// \brief CLion是不会自己生成拷贝构造函数, 需要自己写。这个写法是书上的写法。
        /// \param hasPtrLikeValue
        HasPtrLikeValue(const HasPtrLikeValue& rhs);

        /// \brief 同样CLion是不会自己生成拷贝构造函数, 需要自己写。这个写法是书上的写法。
        /// \param hasPtrLikeValue
        /// \return
//        HasPtrLikeValue& operator=(const HasPtrLikeValue& rhs);

        // Big-Three end

    private:
        std::string* ptrString;
        int defaultValue;

    };

}


#endif //MODERNCPP_HASPTRLIKEVALUE_HPP
